سوال ۸

پس از unzip کردن فایل لازم است تا عکس های درون دیتاست را بخوانیم. برای این کار از کتابخانه‌ی CV2 استفاده میکنیم. برای آنکه سایز تمامی عکس ها یکسان باشد و دیتای منظم تری داشته باشیم از همین کتاب خانه برای تغییر سایز عکس ها استفاده میکنیم.
پس از خواندن تمامی عکس ها به طبقه بندی بر اساس رنگ عکس ها میپردازیم. برای اینکار با استفاده از کتابخانه CV2 میانگین رنگ در هر عکس را بدست آورده و آن را تبدیل به ۳ کانال رنگی میکنیم. سپس ۲ کانال آبی و قرمز را باهم مقایسه میکنیم. اگر کانال آبی مقدار بیشتری داشت، پس رنگ عکس آبی و عکس در طبقه chelsea قرار میگیرد و label آن ۱ میشود در غیر این صورت عکس در طبقه manchester و label آن ۰ میشود.
حال feature های هر کلاس را جدا میکنیم. سپس الگوریتم EM را برای تخمین پارامتر هاس توزیع GMM مربوط به هر کلاس را با تابع gaussianMixture از کتابخانه sklearn پیاده‌سازی میکنیم.
در ادامه پارامتر های بدست آمده برای GMM هر کلاس را مشاهده میکنید.
حال به کشیدن نمودار داده ها و کانتور های مدل GMM هر کلاس توسط تابع multivariate_normal از کتابخانه scipy میپردازیم.
در این بخش تمام مراحل بالا را به ازای تعداد کامپوننت های ۱ تا ۲۰ انجام میدهیم. در ادامه تمام پارامتر های تخمین زده شده برای هر k و نمودار داده ها و کانتور ها را برای آن تعداد k مشاهده میکنید. همچنین در آخر نمودار های bic و aic کشیده شده اند. برای بدست آوردن مقدار بهینه k، k ای را پیدا میکنیم که در آن مجموع bic و aic کمینه شده باشد.

سوال ۹

ابتدا به خواندن داده ها از فایل csv می پردازیم.
حال در ادامه به preprocess این داده های می پردازیم. ابتدا باید ببینیم آیا این دیتاست داده های miss شده دارد یا نه. همانطور که در ادامه مشخص است تمام feature ها به جز island، دارای مقدار miss شده هستند.
برای پر کردن این مقادیر برای تمامی ستون ها از mean() آن ستون و برای ستون sex از مقدار بیشینه در آن ستون استفاده میکنیم.
در ادامه‌ی preprocess باید ستون هایی که مقدارشان به صورت string(object) است را encode کنیم که برای این کار از تابع replace استفاده شده است.
این بخش از این سوال مانند سوال قبل است. در این بخش ابتدا نمودار داده ها بر حسب دو feature داده شده را میکشیم. طبق این نمودار ها به نظر میرسد در حالت اول که دو feature به نام های culmen_length_mm و culmen_depth_mmهستند، gmm، discriminabilty بهتری داشته باشد.
حال به پیاده‌سازی gmm model ها می پردازیم و مانند سوال قبل برای هر مدل پارامتر ها را نشان داده و سپس نمودارscatter plot آن را به همراه کانتور ها میکشیم.
برای محاسبه خطا و دقت به این صورت عمل میکنیم که به ازای هر دو فیچر، برای هر نمونه، pdf توزیع نرمال ( با میانگین و واریانسی که با مدل gmm با این دو feature بدست آورده بودیم) را برای هر کلاس محاسبه میکنیم. سپس بر اساس آنکه احتمال کدام کلاس بیشتر است، کلاس این نمونه را پیشبینی میکنیم. حال بررسی میکنیم که آیا این پیشبینی با لیبل نمونه همخوانی دارد یا خیر و به این صورت درصد خطا و درصد دقت را برای هر حالت محاسبه میکنیم. همانطور که حدس زده بودیم،‌حالت اول دقت بالاتر و خطای پایین تری دارد.
دیدیم که ۲ feature اول بهترین نتیجه را داشتند. حال مولفه های گوسی را در این حالت بالا برده و نمودا aic و bic را میکشیم. این قسمت نیز مانند سوال قبل پیاده‌سازی شده است. برای هر کلاس k بهینه را به دست آورده و چاپ کرده ایم.

سوال ۱۰

در این بخش ابتدا به همان شیوه گفته شده داده ها را میخواینم. سپس آن ها را توسط یک نمودار scatter میکشیم.
حال در بخش اول سعی بر این است که هر کلاس را توسط توزیع نرمال تخریب بزنیم. برای این کار ابتدا با تخمین بیزی پارامتر ها را تخمین میزنیم. سپس برای کشیدن نمودار داده ها به همراه کانتور مانند دو سوال قبل عمل میکنیم با این تفاوت که در اینجا نمیتوانیم از تابع multivarient_normal استفاده کنیم. میدانیم این تابع یک توزیع گوسی را با میانگین و کواریانسی که به آن میدهیم پیاده‌سازی میکند و سپس با صدا زدن تابع pdf، احتمال یک داده را با این توزیع بر میگرداند. برای جا گذاری یک تابع که pdf یک توزیع گوسی با میانگین و کواریانس مشخص را بر میگرداند ، پیاده‌سازی کرده ایم.
در این بخش به پیاده سازی یک مدل gmm میپردازیم. برای انجام ا ین بخش از چند لینک که در پایین این بخش آمده است استفاده کردم. این کلاس چندین تابع دارد که به شرح زیر است.
تابع fit تابعی است که عملیات اصلی را انجام میدهد. در این تابع ابتدا برخی مقادیر اولیه داده‌میشود و سپس به صورت iterative مراحل e-step و m-step انجام می‌شوند. در تابع e-step ابتدا وزن ها که در نهایت میانگین آن ها ضریب آلفا را می سازد، بدست می‌آیند. برای بدست آوردن این وزن ها طبق فرمول های likelihood و فرمول هایی که در درس آمده است پیش رفته‌ایم.

لینک ها: https://github.com/saniikakulkarni/Gaussian-Mixture-Model-from-scratch/blob/main/Gaussian_Mixture_Model_from_scratch.ipynb https://towardsdatascience.com/gaussian-mixture-models-implemented-from-scratch-1857e40ea566

حال در این بخش نمودار scatter داده ها به همراه کانتور را برای ۳ مدل با تعداد کامپوننت های ۳،۸ و ۱۶ رسم کرده ایم. توجه داشته باشید که چون مقدار اولیه میانگین ها به صورت رندوم مشخص می شود با هر بار اجرا ممکن است به مدل مختلفی برسیم.
در نهایت به کشیدن نمودار aic و bic مپردازیم. در این بخش همانند دو سوال قبل عمل میکنیم، تنها به جای کتابخانه از کلاسی که خودمان پیاده‌سازی کرده‌ایم استفاده میکنیم.